home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1995 January / macformat-020.iso / Shareware City / Applications / Alpha.5.96 folder / Tcl / SystemCode / marks.tcl < prev    next >
Encoding:
Text File  |  1994-08-20  |  4.2 KB  |  196 lines  |  [TEXT/ALFA]

  1.  
  2. # ================================================================================
  3. # Clear marks for front window.
  4. #================================================================================
  5. proc clearFileMarks {} {
  6.     set nm [lindex [winNames -f] 0]
  7.     
  8.     foreach mk [getNamedMarks] {
  9.         if {$nm == [lindex $mk 1]} {
  10.             removeNamedMark -n [lindex $mk 0] -w [lindex $mk 1]
  11.         }
  12.     }
  13. }
  14.  
  15.  
  16. proc sortMarksFile {} {
  17.     if {[askyesno "Really sort all marks?"] != "yes"} {return}
  18.  
  19.     set nm [lindex [winNames -f] 0]
  20.     
  21.     set mks {}
  22.     foreach mk [getNamedMarks] {
  23.         if {$nm == [lindex $mk 1]} {
  24.             removeNamedMark -n [lindex $mk 0] -w [lindex $mk 1]
  25.             lappend mks $mk
  26.         }
  27.     }
  28.  
  29.     foreach mk [lsort $mks] {
  30.         set name [lindex $mk 0]
  31.         set disp [lindex $mk 2]
  32.         set pos [lindex $mk 3]
  33.         set end [lindex $mk 4]
  34.         
  35.         setNamedMark $name $disp $pos $end
  36.     }
  37. }
  38.  
  39. # From Mark Nagata
  40. proc zeroadd {num} {
  41.     set mx [maxPos]
  42.     set len [string length $mx]
  43.     set num [format "%0${len}d" $num]
  44.     return $num
  45. }
  46.  
  47. proc orderMarks {} {
  48.     if {[askyesno "Really reorder all marks?"] != "yes"} {return}
  49.  
  50.     set nm [lindex [winNames -f] 0]
  51.     
  52.     set wks {}
  53.     foreach mk [getNamedMarks] {
  54.         if {$nm == [lindex $mk 1]} {
  55.             removeNamedMark -n [lindex $mk 0] -w $nm
  56.             set name [lindex $mk 0]
  57.             set disp [lindex $mk 2]
  58.             set pos [lindex $mk 3]
  59.             set end [lindex $mk 4]
  60.             set pos [zeroadd $pos]
  61.             set wk [list $pos $disp $name $end]
  62.             lappend wks $wk
  63.         }
  64.     }
  65.  
  66.     foreach wk [lsort $wks] {
  67.         set name [lindex $wk 2]
  68.         set disp [lindex $wk 1]
  69.         set pos [lindex $wk 0]
  70.         set end [lindex $wk 3]
  71.         
  72.         setNamedMark $name $disp $pos $end
  73.     }
  74. }
  75.  
  76. #================================================================================
  77. proc markFile {} {
  78.     global mode
  79.  
  80.     set f [lindex [winNames -f] 0]
  81.     
  82.     watchCursor
  83.     if {([lsearch [getNamedMarks] "*$f*"] >= 0) && [askyesno "Clear previous marks? "] == "yes"} {
  84.         clearFileMarks
  85.     }
  86.     
  87.     catch "${mode}MarkFile"
  88. }
  89.  
  90. proc markAlphaCommands {} {
  91.     set end [maxPos]
  92.     set pos 0
  93.     set l {}
  94.     set num 0
  95.     while {![catch {search -f 1 -r 1 -m 0 -i 1 {^• [a-z]+} $pos} res]} {
  96.         set start [lindex $res 0]
  97.         set end [lindex $res 1]
  98.         set text [lindex [getText $start $end] 1]
  99.         set inds($text) $start
  100.         set pos [nextLineStart $end]
  101.         incr num
  102.         message "$num"
  103.     }
  104.  
  105.     if {[info exists inds]} {
  106.         foreach f [lsort [array names inds]] {
  107.             setNamedMark $f $inds($f) $inds($f) $inds($f)
  108.         }
  109.     }
  110. }    
  111.  
  112. proc markIntro {} {
  113.     set end [maxPos]
  114.     set pos 0
  115.     set l {}
  116.     set num 0
  117.     while {![catch {search -f 1 -r 1 -m 0 -i 0 {^== } $pos} res]} {
  118.         set start [lindex $res 1]
  119.         set end [expr [nextLineStart $start] - 1]
  120.         set text [getText $start $end]
  121.         set inds($text) [lineStart $start]
  122.         set pos [nextLineStart $end]
  123.         incr num
  124.         message "$num"
  125.     }
  126.  
  127.     if {[info exists inds]} {
  128.         foreach f [lsort [array names inds]] {
  129.             setNamedMark $f $inds($f) $inds($f) $inds($f)
  130.         }
  131.     }
  132. }
  133.  
  134. # ================================================================================
  135. # Simple mark stack implementation
  136. # ================================================================================
  137. proc pushMark {} {
  138.     global markStack
  139.     global markName
  140.     
  141.     set name mark$markName
  142.     incr markName
  143.     createTMark $name [getPos]
  144.     set fileName [lindex [winNames -f] 0]
  145.     set markStack [linsert $markStack 0 [list $fileName $name]]
  146.     message [concat Mark [llength $markStack] Pushed]
  147. }
  148.  
  149. proc popMark {} {
  150.     global markStack
  151.     if {[llength $markStack] == "0"} {
  152.         message "The mark stack is empty!"
  153.         return
  154.     }
  155.     set mark [lindex [lindex $markStack 0] 1]
  156.     set markStack [lreplace $markStack 0 0]
  157.     if {[catch {gotoTMark $mark}]} {
  158.         popMark
  159.         return
  160.     }
  161.     message [concat Mark [llength $markStack] Popped]
  162. }
  163.  
  164.     
  165. # Returns 'list' minus all top-level elements matching 'pat'.
  166. # Used in 'closeHooks' to prune the mark stack.
  167. proc removePat {list pat} {
  168.     while 1 {
  169.         set ind [lsearch $list $pat]
  170.         if {$ind == "-1"} {return $list}
  171.         set list [lreplace $list $ind $ind]
  172.     }
  173. }
  174.  
  175.  
  176.  
  177.  
  178. #================================================================================
  179. # Only works while in same file.
  180. #================================================================================
  181.  
  182. proc pointToRegister {} {
  183.     message "Letter?"
  184.     createTMark [set c [getChar]] [getPos]
  185.     message "Register '$c'"
  186. }
  187.  
  188.  
  189. proc jumpToRegister {} {
  190.     message "Letter?"
  191.     gotoTMark [set c [getChar]]
  192.     message "Register '$c'"
  193. }
  194.  
  195.  
  196.